package com.entities.report.list;

import java.util.ArrayList;
import java.util.List;

import com.core.protocols.ICustomDatasourceDelegate;
import com.core.protocols.IServiceLayerDelegate;
import com.core.protocols.ITableViewDatasource;
import com.core.protocols.ITableViewDelegate;
import com.core.ui.controller.base.CustomController;
import com.core.ui.customcell.TableViewCell;
import com.core.ui.customcell.TableViewDataCell;
import com.core.ui.customview.TableViewHeaderCell;
import com.core.utils.GlobalConstants;
import com.core.utils.HTMLTagUtils;
import com.core.utils.IndexPath;
import com.core.utils.LocalizableString;
import com.entities.report.servicelayer.ReportListLayer;
import com.model.KeyValue;
import com.model.report.Report;


public class ReportListController
        extends CustomController
        implements ITableViewDatasource, ITableViewDelegate, IServiceLayerDelegate {

	ArrayList <Report>                reportsList     = null;
	private ReportListLayer           reportListLayer = null;
	private ICustomDatasourceDelegate delegate        = null;



	@Override
	public void setCustomDatasourceDelegate ( ICustomDatasourceDelegate delegate ) {

		this.delegate = delegate;

	}



	@Override
	public void reloadData () {

		reportListLayer = new ReportListLayer();
		reportListLayer.setLayerDelegate(this);
		reportListLayer.performRequestWithFilter(null, null);

	}



	@Override
	public String tableStyleClassName () {

		// TODO Auto-generated method stub
		return null;
	}



	@Override
	public String headerRowStyleClassNameAtIndex ( int index ) {

		// TODO Auto-generated method stub
		return null;
	}



	@Override
	public String headerCellStyleClassNameAtIndexPath ( IndexPath indexPath ) {

		// TODO Auto-generated method stub
		return null;
	}



	@Override
	public String cellStyleClassNameAtIndexPath ( IndexPath indexPath ) {

		// TODO Auto-generated method stub
		return null;
	}



	@Override
	public String rowStyleClassNameAtIndex ( int index ) {

		// TODO Auto-generated method stub
		return null;
	}



	@Override
	public int numberOfHeadRows () {

		return 1;
	}



	@Override
	public int numberOfHeadCols () {

		return 4;
	}



	@Override
	public TableViewHeaderCell headCellAtIndexPath ( IndexPath indexPath ) {

		LocalizableString localizableString = LocalizableString.sharedInstance();

		TableViewHeaderCell result = new TableViewHeaderCell();
		result.setStyleName("headerCellSimple");
		switch ( indexPath.getCol() ) {
			case 0: {
				result.setText("#");
				break;
			}
			case 1: {
				result.setText(localizableString.localizable("entity.ProjectItem.field.name"));
				break;
			}
			case 2: {
				result.setText(localizableString.localizable("entity.ProjectItem.field.reporter"));
				break;
			}
			case 3: {
				result.setText(localizableString.localizable("grid.column.operation"));
				break;
			}

			default:
				break;
		}
		return result;
	}



	@Override
	public int numberOfDataRows () {

		return reportsList.size();
	}



	@Override
	public int numberOfDataCols () {

		return this.numberOfHeadCols();
	}



	@Override
	public TableViewCell dataCellAtIndexPath ( IndexPath indexPath ) {

		LocalizableString localizableString = LocalizableString.sharedInstance();


		Report item = reportsList.get(indexPath.getRow());
		TableViewDataCell result = new TableViewDataCell();
		switch ( indexPath.getCol() ) {
			case 0: {
				result.setStyleName("dataCellSimple");
				result.setText(String.format("%d", 1 + indexPath.getRow()));
				break;
			}
			case 1: {
				result.setStyleName("dataCellSimple maxwidth");
				result.setText(item.getName());
				result.setOnCellClick("%s?%s", GlobalConstants.SERVLET_REPORTINFO, item.idValue().toString());
				break;
			}
			case 2: {
				// String authorText = null;
				result.setStyleName("dataCellSimple");
				// String userName = null;
				// Integer userId = null;
				// User user = item.getAssignee();
				// if ( user != null ) {
				// userName = user.getName();
				// userId = user.getId();
				// String link = String.format("%s?id=%d",
				// GlobalConstants.SERVLET_USERINFO, userId);
				// ArrayList <KeyValue> attrs = new ArrayList <KeyValue>();
				// attrs.add(new KeyValue("href", link, true));
				// attrs.add(new KeyValue("class", "trigger_lnk", true));
				// authorText = HTMLTagUtils.customTag("a", attrs, userName);
				// } else {
				// authorText = "";
				// }

				result.setText("");
				break;
			}
			case 3: {
				String idStrValue = item.idValue().getValue();
				result.setStyleName("dataCellSimple");
				String link = String.format("%s?%s", GlobalConstants.SERVLET_REPORTUPDATE, item.idValue().toString());
				ArrayList <KeyValue> attrs = new ArrayList <KeyValue>();
				attrs.add(new KeyValue("href", link, true));
				attrs.add(new KeyValue("class", "trigger_lnk", true));
				String editText = HTMLTagUtils.customTag("a", attrs, localizableString.localizable("object.operation.edit"));

				String ajax = String.format("javascript:deleteReport(%s);", idStrValue);
				link = "javascript:void(0);";

				attrs = new ArrayList <KeyValue>();
				attrs.add(new KeyValue("href", link, true));
				attrs.add(new KeyValue("class", "trigger_lnk", true));
				attrs.add(new KeyValue("onclick", ajax, true));
				String deleteText = HTMLTagUtils.customTag("a", attrs, localizableString.localizable("object.operation.delete"));

				result.setText(String.format("%s|%s", editText, deleteText));
				break;

			}
			default: {
				break;
			}
		}
		return result;
	}



	@Override
	public <T> void responseResponseItemsList ( final List <T> items,
	                                            final Object request,
	                                            final Exception exception ) {

		reportsList = new ArrayList <Report>();

		if ( exception != null ) {
			return;
		}

		if ( items == null ) {
			return;
		}

		for ( T item : items ) {
			reportsList.add((Report) item);
		}

		if ( delegate != null ) {
			delegate.refreshContent();
		}
	}
}
